package cn.itsource.order.service;

import cn.itsource.basic.domain.aplipayCommon.AlipayBean;
import cn.itsource.basic.domain.aplipayCommon.AlipayConfig;
import cn.itsource.basic.domain.aplipayCommon.AlipayParams;
import cn.itsource.order.OrderEnding;
import com.alibaba.fastjson.JSONObject;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

//这个类的创建，必须要交给spring
@Component
public class AlipayService {

    @Autowired
    private AlipayParams alipayInfo;
    @Autowired
    OrderEnding orderEnding;


    /**
     * 这个方法就是用来：统一实现发起支持操作的公共方法
     *
     * @return
     */
    public String createPayUrl(Double total_amount, String body,String out_trade_no) {
        orderEnding.Ending();
        String result = null;
        try {
            //TODO 根据店铺id查询支付信息
//            TPayAlipayInfo alipayInfo = payAlipayInfoMapper.loadByShopId(dto.getShopId());
            //第1步：获得初始化的AlipayClient
            AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl,
                    alipayInfo.getAppid(), alipayInfo.getMerchantPrivateKey(), "json",
                    AlipayConfig.charset, alipayInfo.getAlipayPublicKey(), AlipayConfig.sign_type);

            //设置请求参数
            AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();

            //下面是一个异步请求。（也是实现 找他人找付或离线付的核心方法）
            //回调URL地址----何时触发？---支付完成之后，就会由支付宝开放台进行回调-平--目的：将支付之后结果返回（支付成功/支付失败（失败原因）
            alipayRequest.setReturnUrl(AlipayConfig.return_url);
            //回调地址----支付通知---通知用户
            //TODO 该回调要生效，需要在支付宝开放平台控制台，设置回调地址
            alipayRequest.setNotifyUrl(AlipayConfig.notify_url);


            /** ************************** 下面的参数，是与系统业务关联 ******************* */
            //商户订单号，商户网站订单系统中唯一订单号，必填(这个订单号，是我们自己系统来生成)
            //String out_trade_no = System.currentTimeMillis() + "";
            System.out.println(">>>>>>>>>>>创建支付订单时，自己后台生成的订单号是：【" + out_trade_no + "】");
            //付款金额，必填（单位：分。所以金额是都没有小数的。金额的支付只会保留2位小数）
            //订单名称，必填：每次支付，订单不允许重复。所以需要自动生成
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            String subject = sdf.format(new Date()) + System.currentTimeMillis();

            //下面这种封装参数的方式，是可以使用fastjson进行替换
            AlipayBean alipayBean = new AlipayBean();
            //设置创建的订单的订单号（必须唯一，不能重复）
            alipayBean.setOut_trade_no(out_trade_no);
            //设置订单的标题
            alipayBean.setSubject(subject);
            //设置订单金额（单位：元）
            alipayBean.setTotal_amount(total_amount + "");
            //设置订单的 描述信息
            alipayBean.setBody(body);
            //将上面的对象转为json字符串
            alipayRequest.setBizContent(JSONObject.toJSONString(alipayBean));
            //向支付宝开放平台发送请求（就是支付宝返回的 支付界面url地址）--->这个返回的结果是一段  html代码片段
            result = alipayClient.pageExecute(alipayRequest).getBody();
            System.out.println("调用支付宝生成支付二维码接口的响应结果====>" + result);
            return result;
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }

        return result;
    }
}
